package cn.imjzm.runcarserve.utils;

import cn.imjzm.runcarserve.pojo.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;

/**
 * 提供发送各种类型邮件的功能，包括
 * -纯文本邮件
 * -HTML格式邮件
 * -带附件邮件
 * -批量发送邮件
 * -注册成功通知邮件
 * -邮件服务测试邮件
 */
@Slf4j
@Service
public class EmailService {

    //spring Boot自动配置的邮件发送器
    @Autowired
    private JavaMailSender javaMailSender;//spring提供的邮件发送器

    //从配置文件中读取的发件人的邮箱地址
    @Value("${spring.mail.username}")
    private String fromEmail;//发件人邮箱地址

    //应用名称，默认值为“RunCar”
    @Value("${app.name:RunCar}")
    private String appName;

    /**
     * 发送纯文本邮件
     * @param toEmail 收件人邮箱地址，不能为空
     * @param subject 邮件主题，不能为空
     * @param body 邮件正文内容，不能为空
     */
    public void sendEmail(String toEmail, String subject, String body) {
        sendEmail(toEmail, subject, body, false);
    }

    /**
     * 发送HTML邮件
     * @param toEmail 收件人邮箱地址
     * @param subject 邮件主题
     * @param htmlBody 邮件正文内容
     */
    public void sendHtmlEmail(String toEmail, String subject, String htmlBody) {
        sendEmail(toEmail, subject, htmlBody, true);
    }

    /**
     * 发送注册成功邮件
     * @param user 注册成功的用户对象
     */
    public void sendRegistrationEmail(User user) {
        String subject = "【" + appName + "】注册成功通知";
        String htmlContent = buildRegistrationEmailContent(user);
        sendHtmlEmail(user.getEmail(), subject, htmlContent);
    }

    /**
     * 发送测试邮件
     * @param toEmail 收件人邮箱地址，用于测试邮件服务是否正常工作
     */
    public void sendTestEmail(String toEmail) {
        String subject = "【" + appName + "】邮件服务测试";
        String content = buildTestEmailContent();
        sendHtmlEmail(toEmail, subject, content);
    }

    /**
     * 发送邮件的核心方法
     * @param toEmail 收件人邮箱地址
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param isHtml 是否为HTML格式
     * @throws IllegalArgumentException 当参数不完整的时候抛出
     * @throws RuntimeException 当邮件发送失败时抛出
     */
    private void sendEmail(String toEmail, String subject, String content, boolean isHtml) {
        // 参数验证
        if (!StringUtils.hasText(toEmail) || !StringUtils.hasText(subject) || !StringUtils.hasText(content)) {
            log.error("邮件发送参数不完整: toEmail={}, subject={}", toEmail, subject);
            throw new IllegalArgumentException("邮件发送参数不能为空");
        }

        try {
            //创建HTML邮件消息
            MimeMessage message = javaMailSender.createMimeMessage();
            //使用MimeMEssageHelper简化邮件设置
            MimeMessageHelper helper = new MimeMessageHelper(
                    message,
                    true, // 支持附件
                    StandardCharsets.UTF_8.name() // 设置编码
            );

            // 设置发件人
            helper.setFrom(fromEmail, appName);//设置发件人及显示名称
            helper.setTo(toEmail);//设置收件人
            helper.setSubject(subject);//设置邮件主题
            helper.setText(content, isHtml);//设置邮件内容，并指定是否为HTML格式

            // 发送邮件
            javaMailSender.send(message);

            //记录发送成功日志
            log.info("邮件发送成功 - 收件人: {}, 主题: {}, 类型: {}",
                    toEmail, subject, isHtml ? "HTML" : "TEXT");

        } catch (MessagingException e) {
            //邮件相关异常处理
            log.error("发送邮件失败 - 收件人: {}, 错误信息: {}", toEmail, e.getMessage(), e);
            throw new RuntimeException("邮件发送失败: " + e.getMessage(), e);
        } catch (Exception e) {
            //其他异常处理
            log.error("发送邮件时发生未知错误 - 收件人: {}, 错误信息: {}", toEmail, e.getMessage(), e);
            throw new RuntimeException("邮件发送失败", e);
        }
    }

    /**
     * 构建HTML邮件的通用模板
     * @param title 邮件标题，将显示在浏览器标签页
     * @param content 邮件主要内容
     * @return 完整的HTML邮件内容字符串
     */
    private String buildHtmlTemplate(String title, String content) { //title邮件标题 content邮件内容
        return "<!DOCTYPE html>" +
                "<html>" +
                "<head><meta charset=\"UTF-8\"><title>" + title + "</title></head>" +
                "<body style=\"font-family: Arial, sans-serif; line-height: 1.6; color: #333;\">" +
                "<div style=\"max-width: 600px; margin: 0 auto; padding: 20px;\">" +
                content +
                "<p style=\"color: #7f8c8d; font-size: 14px;\">此邮件由系统自动发送，请勿回复。</p>" +
                "</div>" +
                "</body>" +
                "</html>";
    }

    /**
     * 构建注册成功邮件内容
     * @param user 注册用户对象，包含用户信息
     * @return 格式化后的HTML邮件内容
     */
    private String buildRegistrationEmailContent(User user) { //user注册用户对象
        String content = "<h2 style=\"color: #2c3e50;\">🎉 欢迎加入 " + appName + "！</h2>" +
                "<p>亲爱的 <strong>" + user.getUsername() + "</strong>，</p>" +
                "<p>恭喜您成功注册 " + appName + " 账户！</p>" +
                "<div style=\"background-color: #e8f5e8; padding: 15px; border-radius: 5px; margin: 20px 0;\">" +
                "<p style=\"margin: 0;\"><strong>📱 邮箱号：</strong> " + user.getEmail() + "</p>" +
                "<p style=\"margin: 5px 0 0 0;\"><strong>📧 邮箱：</strong> " + user.getEmail() + "</p>" +
                "<p style=\"margin: 5px 0 0 0;\"><strong>🕒 注册时间：</strong> " + user.getCreateTime() + "</p>" +
                "</div>" +
                "<p>您现在可以使用注册的手机号和密码登录系统。</p>";

        return buildHtmlTemplate("注册成功", content);
    }

    /**
     * 构建测试邮件内容
     * @return 格式化后的HTML测试邮件内容
     */
    private String buildTestEmailContent() {
        String content = "<h2 style=\"color: #2c3e50;\">🎉 邮件服务测试成功！</h2>" +
                "<p>恭喜您，<strong>" + appName + "</strong> 的邮件服务已经配置成功并正常工作。</p>" +
                "<div style=\"background-color: #e8f5e8; padding: 15px; border-radius: 5px; margin: 20px 0;\">" +
                "<p style=\"margin: 0;\"><strong>✅ 测试结果：</strong> 邮件发送功能正常</p>" +
                "<p style=\"margin: 5px 0 0 0;\"><strong>📧 SMTP服务器：</strong> QQ邮箱</p>" +
                "<p style=\"margin: 5px 0 0 0;\"><strong>🕒 发送时间：</strong> " + LocalDateTime.now() + "</p>" +
                "</div>" +
                "<p style=\"color: #7f8c8d; font-size: 14px;\">此邮件由系统自动发送，用于测试邮件服务功能。</p>";

        return buildHtmlTemplate("邮件服务测试", content);
    }

    // 其他方法保持不变...
    /**
     * 发送带附件的邮件
     * @param toEmail 收件人邮箱地址
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param isHtml 是否为HTML格式
     * @param attachmentPath 附件文件路径
     * @param attachmentName 附件显示名称
     * @throws RuntimeException 当邮件发送失败时抛出
     */
    public void sendEmailWithAttachment(String toEmail, String subject, String content,
                                        boolean isHtml, String attachmentPath, String attachmentName) {
        try {
            //创建MIME邮件消息
            MimeMessage message = javaMailSender.createMimeMessage();
            //使用MimeMessageHelper简化邮件设置
            MimeMessageHelper helper = new MimeMessageHelper(message, true, StandardCharsets.UTF_8.name());

            //设置邮件基本信息
            helper.setFrom(fromEmail, appName);
            helper.setTo(toEmail);
            helper.setSubject(subject);
            helper.setText(content, isHtml);

            //添加附件
            if (StringUtils.hasText(attachmentPath) && StringUtils.hasText(attachmentName)) {
                helper.addAttachment(attachmentName, new java.io.File(attachmentPath));
            }

            //执行邮件发送
            javaMailSender.send(message);
            //记录发送成功日志
            log.info("带附件邮件发送成功 - 收件人: {}, 附件: {}", toEmail, attachmentName);

        } catch (Exception e) {
            //异常处理
            log.error("发送带附件邮件失败 - 收件人: {}, 错误: {}", toEmail, e.getMessage(), e);
            throw new RuntimeException("带附件邮件发送失败: " + e.getMessage(), e);
        }
    }

    /**
     * 批量发送邮件
     * @param toEmails 收件人邮箱地址数组
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param isHtml 是否为HTML格式
     */
    public void sendBatchEmails(String[] toEmails, String subject, String content, boolean isHtml) {
        if (toEmails == null || toEmails.length == 0) {
            log.warn("批量发送邮件失败: 收件人列表为空");
            return;
        }

        int successCount = 0;//成功计数
        int failCount = 0;//失败计数

        //遍历收件人列表
        for (String email : toEmails) {
            try {
                //发送单封邮件
                sendEmail(email, subject, content, isHtml);
                successCount++;
            } catch (Exception e) {
                //记录失败情况
                failCount++;
                log.error("批量发送邮件失败 - 收件人: {}, 错误: {}", email, e.getMessage());
            }
        }

        //记录批量发送结果
        log.info("批量邮件发送完成 - 成功: {}, 失败: {}, 总计: {}",
                successCount, failCount, toEmails.length);
    }
}